{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "03bd465c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "import random \n",
    "import time"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d5d67cd",
   "metadata": {},
   "source": [
    "数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cdff2203",
   "metadata": {},
   "outputs": [],
   "source": [
    "df=pd.read_csv('E:/推荐系统/数据集/MovieLens/ml-latest/ratings.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "39ea333b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用时：9.518189秒\n"
     ]
    }
   ],
   "source": [
    "#划分训练集测试集\n",
    "'''\n",
    "users_number表示选择的用户数量，train_percent表示训练集比例\n",
    "'''\n",
    "start=time.time()\n",
    "N=0\n",
    "users_number=500\n",
    "training_percent=0.9\n",
    "train=pd.DataFrame(columns=list(df))\n",
    "test=pd.DataFrame(columns=list(df))\n",
    "for user,result in df.groupby('userId'):\n",
    "    result=result.reset_index(drop=True)\n",
    "    time_lst=list(result['timestamp'])\n",
    "    index_train=np.argsort(time_lst)[:int(len(time_lst)*training_percent)]\n",
    "    index_test=np.argsort(time_lst)[int(len(time_lst)*training_percent)+1:]\n",
    "    train=pd.concat([train,result.iloc[index_train]])\n",
    "    test=pd.concat([test,result.iloc[index_test]])\n",
    "    N+=1\n",
    "    if N>users_number:\n",
    "        break\n",
    "train=train.reset_index(drop=True)\n",
    "test=test.reset_index(drop=True)\n",
    "end=time.time()\n",
    "print(\"用时：%f秒\"%(end-start))\n",
    "train['istest']=0\n",
    "test['istest']=1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4983d28a",
   "metadata": {},
   "outputs": [],
   "source": [
    "test=pd.read_csv('E:/推荐系统/数据集/MovieLens/ml-latest/中间量/评分预测问题_1千用户_test.csv')\n",
    "train=pd.read_csv('E:/推荐系统/数据集/MovieLens/ml-latest/中间量/评分预测问题_1千用户_train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "12e06346",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据集中的电影部数：53889\n",
      "数据集中的用户数：283228\n",
      "训练集中的电影部数：8529\n",
      "训练集中的用户数：977\n"
     ]
    }
   ],
   "source": [
    "print(\"数据集中的电影部数：%d\"%len(df['movieId'].unique()))\n",
    "print(\"数据集中的用户数：%d\"%len(df['userId'].unique()))\n",
    "print(\"训练集中的电影部数：%d\"%len(train['movieId'].unique()))\n",
    "print(\"训练集中的用户数：%d\"%len(train['userId'].unique()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3fccae3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "record：训练集+测试集。\n",
    "'''\n",
    "record=pd.concat([train,test])\n",
    "record=record.reset_index(drop=True)\n",
    "record['pre']=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f0a4325b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>movieId</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>istest</th>\n",
       "      <th>pre</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>3826</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1256677210</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>307</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1256677221</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1590</td>\n",
       "      <td>2.5</td>\n",
       "      <td>1256677236</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>2478</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1256677239</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>3698</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1256677243</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94978</th>\n",
       "      <td>1000</td>\n",
       "      <td>102993</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1516313264</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94979</th>\n",
       "      <td>1000</td>\n",
       "      <td>159717</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1516313279</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94980</th>\n",
       "      <td>1000</td>\n",
       "      <td>89864</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1516313291</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94981</th>\n",
       "      <td>1000</td>\n",
       "      <td>73860</td>\n",
       "      <td>4.5</td>\n",
       "      <td>1516313299</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94982</th>\n",
       "      <td>1000</td>\n",
       "      <td>109374</td>\n",
       "      <td>2.5</td>\n",
       "      <td>1534443939</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>94983 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       userId  movieId  rating   timestamp  istest  pre\n",
       "0           1     3826     2.0  1256677210       0    0\n",
       "1           1      307     3.5  1256677221       0    0\n",
       "2           1     1590     2.5  1256677236       0    0\n",
       "3           1     2478     4.0  1256677239       0    0\n",
       "4           1     3698     3.5  1256677243       0    0\n",
       "...       ...      ...     ...         ...     ...  ...\n",
       "94978    1000   102993     4.0  1516313264       1    0\n",
       "94979    1000   159717     4.0  1516313279       1    0\n",
       "94980    1000    89864     3.5  1516313291       1    0\n",
       "94981    1000    73860     4.5  1516313299       1    0\n",
       "94982    1000   109374     2.5  1534443939       1    0\n",
       "\n",
       "[94983 rows x 6 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbac3903",
   "metadata": {},
   "source": [
    "定义需要函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "44c7a2fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "#初始化P,Q向量\n",
    "def InitializePQ(F,all_users_set,all_items_set):\n",
    "    P={user:np.random.randn(F) for user in all_users_set}\n",
    "    Q={item:np.random.randn(F) for item in all_items_set}\n",
    "    return P,Q\n",
    "\n",
    "def sigmoid(inx):\n",
    "    if inx >= 0:  # 对sigmoid函数的优化，避免了出现极大的数据溢出\n",
    "        return 1.0 / (1 + np.exp(-inx))\n",
    "    else:\n",
    "        return np.exp(inx) / (1 + np.exp(inx))\n",
    "\n",
    "#得到rui的预测值\n",
    "def Predict(P_user,Q_item):\n",
    "    return np.multiply( P_user,Q_item ).sum()\n",
    "def rmse(rating1,rating2):\n",
    "    #rating2为实际评分，rating1为预测\n",
    "    return (np.sum((rating1 - rating2) ** 2) / len(rating2))**0.5\n",
    "def mae(rating1,rating2):\n",
    "    return abs(np.sum((rating1 - rating2)) / len(rating2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0208dfda",
   "metadata": {},
   "outputs": [],
   "source": [
    "def validation_predct(validation,P,Q):\n",
    "    '''\n",
    "    '''\n",
    "    pre_list=[]\n",
    "    true_rating_list=[]\n",
    "    validation_loss=0\n",
    "    \n",
    "    for index,r in validation.groupby(validation.index):\n",
    "        userId=int(r['userId'].values[0])\n",
    "        movieId=int(r['movieId'].values[0])\n",
    "        if (userId not in P)|(movieId not in Q):\n",
    "            continue\n",
    "        else:\n",
    "            pre_list.append(Predict(P[userId],Q[movieId]))\n",
    "            true_rating_list.append(r['rating'].values[0])\n",
    "            \n",
    "    pre=np.array(pre_list)\n",
    "    true=np.array(true_rating_list)\n",
    "    validation_loss = sum((pre-true)**2)/len(true)\n",
    "    \n",
    "    return validation_loss, rmse(pre,true),mae(pre,true) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "54cd2966",
   "metadata": {},
   "outputs": [],
   "source": [
    "#梯度下降法计算P，Q\n",
    "def LatentFactorModel(train,F,alpha,lambda_,steps):\n",
    "    '''\n",
    "    F:隐特征个数\n",
    "    alpha：学习率\n",
    "    lambda_：正则项系数\n",
    "    ratio：负样本与正样本比例\n",
    "    steps：迭代总次数\n",
    "    all_users_set：训练集所有用户集合\n",
    "    all_items_set：训练集所有物品集合\n",
    "    all_items：训练集所有物品列表，包括重复交互\n",
    "    '''\n",
    "    all_users_set=set(train['userId'])\n",
    "    all_items_set=set(train['movieId'])\n",
    "    P,Q=InitializePQ(F,all_users_set,all_items_set)\n",
    "    all_items=list(train['movieId'])\n",
    "    train_ = train.drop(index=list((train.sample(frac=0.05,replace=False,random_state=1).index)))\n",
    "    validation = train.sample(frac=0.05,replace=False,random_state=1)   \n",
    "    \n",
    "    train_rmse_lst=[]\n",
    "    validation_rmse_lst=[]\n",
    "    train_mae_lst=[]\n",
    "    validation_mae_lst=[]   \n",
    "    \n",
    "    mae_temp=100\n",
    "    for step in range(0,steps):\n",
    "        train_loss=0\n",
    "        for user, result in train_.groupby('userId'):          \n",
    "            result=result.reset_index(drop=True)\n",
    "            result=result[['movieId','rating']]\n",
    "            for index in range(result.shape[0]):                              #随机梯度下降方法，每次拿出一个样本和样本标签来更新P和Q中对应的参数\n",
    "                item = result.iloc[index]['movieId']\n",
    "                rui = result.iloc[index]['rating']\n",
    "                eui = rui - Predict(P[user],Q[item])\n",
    "                train_loss += eui**2\n",
    "                \n",
    "                #更新参数\n",
    "                P[user]+= alpha*( eui*Q[item]-lambda_*P[user] )            #向量化加速\n",
    "                Q[item]+= alpha*( eui*P[user]-lambda_*Q[item] )\n",
    "        \n",
    "        validation_loss, rmse_validation, mae_validation = validation_predct(validation,P,Q)\n",
    "        print(\"第%d步训练集损失为：%f\"%(step+1,train_loss/train_.shape[0]))\n",
    "        print(\"第%d步验证集损失为：%f\"%(step+1,validation_loss))\n",
    "        print(\"第%d步验证集rmse为：%f\"%(step+1,rmse_validation))\n",
    "        print(\"第%d步验证集mae为：%f\"%(step+1,mae_validation))\n",
    "        \n",
    "        if alpha<=0.001:\n",
    "            alpha=0.001\n",
    "        else:\n",
    "            alpha*=0.99                                                        #学习率衰减\n",
    "        \n",
    "        if mae_temp<mae_validation:\n",
    "            break\n",
    "        else:\n",
    "            mae_temp=mae_validation\n",
    "            \n",
    "        train_loss, rmse_train, mae_train = validation_predct(train_,P,Q) \n",
    "    \n",
    "        train_rmse_lst.append(rmse_train)\n",
    "        validation_rmse_lst.append(rmse_validation)\n",
    "        train_mae_lst.append(mae_train)\n",
    "        validation_mae_lst.append(mae_validation)\n",
    "    \n",
    "        \n",
    "    return P,Q,train_rmse_lst,validation_rmse_lst,train_mae_lst,validation_mae_lst"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bb2d0034",
   "metadata": {},
   "outputs": [],
   "source": [
    "#利用训练好的结果对测试集预测\n",
    "def test_predict(record,P,Q):\n",
    "    start=time.time()\n",
    "    \n",
    "    #其实只预测测试集中的评分即可，不需要预测训练集的评分。但这里对record中每一条行为数据都做出了一个评分。\n",
    "    for index,r in record.groupby(record.index):\n",
    "        userId=int(r['userId'].values[0])\n",
    "        movieId=int(r['movieId'].values[0])\n",
    "        if userId not in P:\n",
    "            print(\"无法对用户%d关于电影%d做出预测，因为训练集中没有该用户数据\"%(userId,movieId))\n",
    "            continue\n",
    "        if movieId not in Q:\n",
    "            print(\"无法对用户%d关于电影%d做出预测，因为训练集中没有该物品数据\"%(userId,movieId))\n",
    "            continue\n",
    "        record.loc[index,'pre']=Predict(P[userId],Q[movieId])\n",
    "    end=time.time()\n",
    "    print(\"用时%f秒\"%(end-start))\n",
    "    \n",
    "    #提取出测试集部分，根据预测结果计算评价指标\n",
    "    record_test=record[record['istest']==1].copy()\n",
    "    print(\"RMSE为：%.5f\"%rmse(record_test['pre'],record_test['rating']))\n",
    "    print(\"MAE为：%.5f\"%mae(record_test['pre'],record_test['rating']))\n",
    "    return record_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "21177bf4",
   "metadata": {},
   "outputs": [],
   "source": [
    "#可以承接上次的训练结果继续训练\n",
    "def LatentFactorModel_continue(train,F,alpha,lambda_,steps,P,Q):\n",
    "    '''\n",
    "    F:隐特征个数\n",
    "    alpha：学习率\n",
    "    lambda_：正则项系数\n",
    "    ratio：负样本与正样本比例\n",
    "    steps：迭代总次数\n",
    "    '''\n",
    "\n",
    "    \n",
    "    for step in range(0,steps):\n",
    "        err_sum=0\n",
    "        for user, result in train.groupby('userId'):          \n",
    "            result=result.reset_index(drop=True)\n",
    "            result=result[['movieId','rating']]\n",
    "#             items_set=set(result['movieId'])\n",
    "#             samples=RandSelectNegativeSamples(items_set,all_items,ratio)  #针对该用户，生成完整的正负样本，用来训练P，Q\n",
    "            for index in range(result.shape[0]):                              #随机梯度下降方法，每次拿出一个样本和样本标签来更新P和Q中对应的参数\n",
    "                item = result.iloc[index]['movieId']\n",
    "                rui = result.iloc[index]['rating']\n",
    "                eui = rui - Predict(P[user],Q[item])\n",
    "                err_sum+= eui**2\n",
    "                P[user]+= alpha*( eui*Q[item]-lambda_*P[user] )            #向量化加速\n",
    "                Q[item]+= alpha*( eui*P[user]-lambda_*Q[item] )\n",
    "\n",
    "        print(\"第%d步损失为：%f\"%(step+1,err_sum))\n",
    "        alpha*=0.9                                                        #学习率衰减\n",
    "    return P,Q"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "735cf18d",
   "metadata": {},
   "source": [
    "训练PQ，预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "455c6e64",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第1步训练集损失为：17.621485\n",
      "第1步验证集损失为：11.321647\n",
      "第1步验证集rmse为：3.364766\n",
      "第1步验证集mae为：2.416678\n",
      "第2步训练集损失为：6.155648\n",
      "第2步验证集损失为：6.847257\n",
      "第2步验证集rmse为：2.616726\n",
      "第2步验证集mae为：1.317484\n",
      "第3步训练集损失为：3.667624\n",
      "第3步验证集损失为：5.378761\n",
      "第3步验证集rmse为：2.319216\n",
      "第3步验证集mae为：0.956914\n",
      "第4步训练集损失为：2.665463\n",
      "第4步验证集损失为：4.650090\n",
      "第4步验证集rmse为：2.156407\n",
      "第4步验证集mae为：0.773607\n",
      "第5步训练集损失为：2.122652\n",
      "第5步验证集损失为：4.212315\n",
      "第5步验证集rmse为：2.052393\n",
      "第5步验证集mae为：0.666742\n",
      "第6步训练集损失为：1.781051\n",
      "第6步验证集损失为：3.917318\n",
      "第6步验证集rmse为：1.979222\n",
      "第6步验证集mae为：0.598168\n",
      "第7步训练集损失为：1.545580\n",
      "第7步验证集损失为：3.704306\n",
      "第7步验证集rmse为：1.924657\n",
      "第7步验证集mae为：0.550686\n",
      "第8步训练集损失为：1.373337\n",
      "第8步验证集损失为：3.543298\n",
      "第8步验证集rmse为：1.882365\n",
      "第8步验证集mae为：0.515834\n",
      "第9步训练集损失为：1.242039\n",
      "第9步验证集损失为：3.417440\n",
      "第9步验证集rmse为：1.848632\n",
      "第9步验证集mae为：0.489114\n",
      "第10步训练集损失为：1.138874\n",
      "第10步验证集损失为：3.316439\n",
      "第10步验证集rmse为：1.821109\n",
      "第10步验证集mae为：0.467948\n",
      "第11步训练集损失为：1.055897\n",
      "第11步验证集损失为：3.233656\n",
      "第11步验证集rmse为：1.798237\n",
      "第11步验证集mae为：0.450759\n",
      "第12步训练集损失为：0.987891\n",
      "第12步验证集损失为：3.164620\n",
      "第12步验证集rmse为：1.778938\n",
      "第12步验证集mae为：0.436527\n",
      "第13步训练集损失为：0.931277\n",
      "第13步验证集损失为：3.106219\n",
      "第13步验证集rmse为：1.762447\n",
      "第13步验证集mae为：0.424556\n",
      "第14步训练集损失为：0.883518\n",
      "第14步验证集损失为：3.056217\n",
      "第14步验证集rmse为：1.748204\n",
      "第14步验证集mae为：0.414356\n",
      "第15步训练集损失为：0.842763\n",
      "第15步验证集损失为：3.012964\n",
      "第15步验证集rmse为：1.735789\n",
      "第15步验证集mae为：0.405571\n",
      "第16步训练集损失为：0.807632\n",
      "第16步验证集损失为：2.975220\n",
      "第16步验证集rmse为：1.724882\n",
      "第16步验证集mae为：0.397934\n",
      "第17步训练集损失为：0.777077\n",
      "第17步验证集损失为：2.942026\n",
      "第17步验证集rmse为：1.715234\n",
      "第17步验证集mae为：0.391242\n",
      "第18步训练集损失为：0.750288\n",
      "第18步验证集损失为：2.912637\n",
      "第18步验证集rmse为：1.706645\n",
      "第18步验证集mae为：0.385335\n",
      "第19步训练集损失为：0.726632\n",
      "第19步验证集损失为：2.886459\n",
      "第19步验证集rmse为：1.698958\n",
      "第19步验证集mae为：0.380090\n",
      "第20步训练集损失为：0.705602\n",
      "第20步验证集损失为：2.863013\n",
      "第20步验证集rmse为：1.692044\n",
      "第20步验证集mae为：0.375406\n",
      "第21步训练集损失为：0.686795\n",
      "第21步验证集损失为：2.841912\n",
      "第21步验证集rmse为：1.685797\n",
      "第21步验证集mae为：0.371202\n",
      "第22步训练集损失为：0.669880\n",
      "第22步验证集损失为：2.822836\n",
      "第22步验证集rmse为：1.680130\n",
      "第22步验证集mae为：0.367411\n",
      "第23步训练集损失为：0.654588\n",
      "第23步验证集损失为：2.805519\n",
      "第23步验证集rmse为：1.674968\n",
      "第23步验证集mae为：0.363977\n",
      "第24步训练集损失为：0.640696\n",
      "第24步验证集损失为：2.789739\n",
      "第24步验证集rmse为：1.670251\n",
      "第24步验证集mae为：0.360855\n",
      "第25步训练集损失为：0.628017\n",
      "第25步验证集损失为：2.775309\n",
      "第25步验证集rmse为：1.665926\n",
      "第25步验证集mae为：0.358005\n",
      "第26步训练集损失为：0.616397\n",
      "第26步验证集损失为：2.762070\n",
      "第26步验证集rmse为：1.661948\n",
      "第26步验证集mae为：0.355394\n",
      "第27步训练集损失为：0.605702\n",
      "第27步验证集损失为：2.749886\n",
      "第27步验证集rmse为：1.658278\n",
      "第27步验证集mae为：0.352995\n",
      "第28步训练集损失为：0.595821\n",
      "第28步验证集损失为：2.738639\n",
      "第28步验证集rmse为：1.654883\n",
      "第28步验证集mae为：0.350782\n",
      "第29步训练集损失为：0.586659\n",
      "第29步验证集损失为：2.728227\n",
      "第29步验证集rmse为：1.651735\n",
      "第29步验证集mae为：0.348735\n",
      "第30步训练集损失为：0.578134\n",
      "第30步验证集损失为：2.718564\n",
      "第30步验证集rmse为：1.648807\n",
      "第30步验证集mae为：0.346836\n",
      "第31步训练集损失为：0.570175\n",
      "第31步验证集损失为：2.709573\n",
      "第31步验证集rmse为：1.646078\n",
      "第31步验证集mae为：0.345069\n",
      "第32步训练集损失为：0.562722\n",
      "第32步验证集损失为：2.701185\n",
      "第32步验证集rmse为：1.643528\n",
      "第32步验证集mae为：0.343419\n",
      "第33步训练集损失为：0.555722\n",
      "第33步验证集损失为：2.693342\n",
      "第33步验证集rmse为：1.641140\n",
      "第33步验证集mae为：0.341876\n",
      "第34步训练集损失为：0.549130\n",
      "第34步验证集损失为：2.685991\n",
      "第34步验证集rmse为：1.638899\n",
      "第34步验证集mae为：0.340428\n",
      "第35步训练集损失为：0.542904\n",
      "第35步验证集损失为：2.679086\n",
      "第35步验证集rmse为：1.636791\n",
      "第35步验证集mae为：0.339065\n",
      "第36步训练集损失为：0.537010\n",
      "第36步验证集损失为：2.672587\n",
      "第36步验证集rmse为：1.634805\n",
      "第36步验证集mae为：0.337780\n",
      "第37步训练集损失为：0.531416\n",
      "第37步验证集损失为：2.666456\n",
      "第37步验证集rmse为：1.632929\n",
      "第37步验证集mae为：0.336565\n",
      "第38步训练集损失为：0.526097\n",
      "第38步验证集损失为：2.660661\n",
      "第38步验证集rmse为：1.631153\n",
      "第38步验证集mae为：0.335413\n",
      "第39步训练集损失为：0.521028\n",
      "第39步验证集损失为：2.655174\n",
      "第39步验证集rmse为：1.629470\n",
      "第39步验证集mae为：0.334318\n",
      "第40步训练集损失为：0.516187\n",
      "第40步验证集损失为：2.649967\n",
      "第40步验证集rmse为：1.627872\n",
      "第40步验证集mae为：0.333276\n",
      "第41步训练集损失为：0.511556\n",
      "第41步验证集损失为：2.645019\n",
      "第41步验证集rmse为：1.626351\n",
      "第41步验证集mae为：0.332281\n",
      "第42步训练集损失为：0.507117\n",
      "第42步验证集损失为：2.640308\n",
      "第42步验证集rmse为：1.624902\n",
      "第42步验证集mae为：0.331330\n",
      "第43步训练集损失为：0.502857\n",
      "第43步验证集损失为：2.635815\n",
      "第43步验证集rmse为：1.623519\n",
      "第43步验证集mae为：0.330418\n",
      "第44步训练集损失为：0.498762\n",
      "第44步验证集损失为：2.631523\n",
      "第44步验证集rmse为：1.622197\n",
      "第44步验证集mae为：0.329542\n",
      "第45步训练集损失为：0.494819\n",
      "第45步验证集损失为：2.627418\n",
      "第45步验证集rmse为：1.620931\n",
      "第45步验证集mae为：0.328699\n",
      "第46步训练集损失为：0.491019\n",
      "第46步验证集损失为：2.623485\n",
      "第46步验证集rmse为：1.619718\n",
      "第46步验证集mae为：0.327887\n",
      "第47步训练集损失为：0.487351\n",
      "第47步验证集损失为：2.619713\n",
      "第47步验证集rmse为：1.618553\n",
      "第47步验证集mae为：0.327102\n",
      "第48步训练集损失为：0.483806\n",
      "第48步验证集损失为：2.616089\n",
      "第48步验证集rmse为：1.617433\n",
      "第48步验证集mae为：0.326342\n",
      "第49步训练集损失为：0.480377\n",
      "第49步验证集损失为：2.612605\n",
      "第49步验证集rmse为：1.616355\n",
      "第49步验证集mae为：0.325606\n",
      "第50步训练集损失为：0.477056\n",
      "第50步验证集损失为：2.609250\n",
      "第50步验证集rmse为：1.615317\n",
      "第50步验证集mae为：0.324891\n",
      "第51步训练集损失为：0.473838\n",
      "第51步验证集损失为：2.606016\n",
      "第51步验证集rmse为：1.614316\n",
      "第51步验证集mae为：0.324196\n",
      "第52步训练集损失为：0.470716\n",
      "第52步验证集损失为：2.602896\n",
      "第52步验证集rmse为：1.613349\n",
      "第52步验证集mae为：0.323519\n",
      "第53步训练集损失为：0.467684\n",
      "第53步验证集损失为：2.599883\n",
      "第53步验证集rmse为：1.612415\n",
      "第53步验证集mae为：0.322859\n",
      "第54步训练集损失为：0.464739\n",
      "第54步验证集损失为：2.596970\n",
      "第54步验证集rmse为：1.611512\n",
      "第54步验证集mae为：0.322214\n",
      "第55步训练集损失为：0.461875\n",
      "第55步验证集损失为：2.594152\n",
      "第55步验证集rmse为：1.610637\n",
      "第55步验证集mae为：0.321584\n",
      "第56步训练集损失为：0.459088\n",
      "第56步验证集损失为：2.591424\n",
      "第56步验证集rmse为：1.609790\n",
      "第56步验证集mae为：0.320967\n",
      "第57步训练集损失为：0.456374\n",
      "第57步验证集损失为：2.588780\n",
      "第57步验证集rmse为：1.608969\n",
      "第57步验证集mae为：0.320362\n",
      "第58步训练集损失为：0.453731\n",
      "第58步验证集损失为：2.586216\n",
      "第58步验证集rmse为：1.608172\n",
      "第58步验证集mae为：0.319768\n",
      "第59步训练集损失为：0.451154\n",
      "第59步验证集损失为：2.583729\n",
      "第59步验证集rmse为：1.607398\n",
      "第59步验证集mae为：0.319185\n",
      "第60步训练集损失为：0.448641\n",
      "第60步验证集损失为：2.581314\n",
      "第60步验证集rmse为：1.606647\n",
      "第60步验证集mae为：0.318612\n",
      "第61步训练集损失为：0.446188\n",
      "第61步验证集损失为：2.578968\n",
      "第61步验证集rmse为：1.605916\n",
      "第61步验证集mae为：0.318047\n",
      "第62步训练集损失为：0.443794\n",
      "第62步验证集损失为：2.576687\n",
      "第62步验证集rmse为：1.605206\n",
      "第62步验证集mae为：0.317491\n",
      "第63步训练集损失为：0.441456\n",
      "第63步验证集损失为：2.574469\n",
      "第63步验证集rmse为：1.604515\n",
      "第63步验证集mae为：0.316943\n",
      "第64步训练集损失为：0.439172\n",
      "第64步验证集损失为：2.572311\n",
      "第64步验证集rmse为：1.603843\n",
      "第64步验证集mae为：0.316402\n",
      "第65步训练集损失为：0.436939\n",
      "第65步验证集损失为：2.570210\n",
      "第65步验证集rmse为：1.603187\n",
      "第65步验证集mae为：0.315868\n",
      "第66步训练集损失为：0.434756\n",
      "第66步验证集损失为：2.568164\n",
      "第66步验证集rmse为：1.602549\n",
      "第66步验证集mae为：0.315340\n",
      "第67步训练集损失为：0.432621\n",
      "第67步验证集损失为：2.566171\n",
      "第67步验证集rmse为：1.601927\n",
      "第67步验证集mae为：0.314818\n",
      "第68步训练集损失为：0.430531\n",
      "第68步验证集损失为：2.564228\n",
      "第68步验证集rmse为：1.601321\n",
      "第68步验证集mae为：0.314302\n",
      "第69步训练集损失为：0.428487\n",
      "第69步验证集损失为：2.562334\n",
      "第69步验证集rmse为：1.600729\n",
      "第69步验证集mae为：0.313791\n",
      "第70步训练集损失为：0.426485\n",
      "第70步验证集损失为：2.560486\n",
      "第70步验证集rmse为：1.600152\n",
      "第70步验证集mae为：0.313284\n",
      "第71步训练集损失为：0.424524\n",
      "第71步验证集损失为：2.558683\n",
      "第71步验证集rmse为：1.599588\n",
      "第71步验证集mae为：0.312782\n",
      "第72步训练集损失为：0.422604\n",
      "第72步验证集损失为：2.556923\n",
      "第72步验证集rmse为：1.599038\n",
      "第72步验证集mae为：0.312285\n",
      "第73步训练集损失为：0.420722\n",
      "第73步验证集损失为：2.555205\n",
      "第73步验证集rmse为：1.598501\n",
      "第73步验证集mae为：0.311791\n",
      "第74步训练集损失为：0.418878\n",
      "第74步验证集损失为：2.553527\n",
      "第74步验证集rmse为：1.597976\n",
      "第74步验证集mae为：0.311301\n",
      "第75步训练集损失为：0.417071\n",
      "第75步验证集损失为：2.551888\n",
      "第75步验证集rmse为：1.597463\n",
      "第75步验证集mae为：0.310815\n",
      "第76步训练集损失为：0.415299\n",
      "第76步验证集损失为：2.550286\n",
      "第76步验证集rmse为：1.596962\n",
      "第76步验证集mae为：0.310332\n",
      "第77步训练集损失为：0.413561\n",
      "第77步验证集损失为：2.548721\n",
      "第77步验证集rmse为：1.596471\n",
      "第77步验证集mae为：0.309852\n",
      "第78步训练集损失为：0.411856\n",
      "第78步验证集损失为：2.547190\n",
      "第78步验证集rmse为：1.595992\n",
      "第78步验证集mae为：0.309375\n",
      "第79步训练集损失为：0.410184\n",
      "第79步验证集损失为：2.545692\n",
      "第79步验证集rmse为：1.595523\n",
      "第79步验证集mae为：0.308901\n",
      "第80步训练集损失为：0.408543\n",
      "第80步验证集损失为：2.544228\n",
      "第80步验证集rmse为：1.595064\n",
      "第80步验证集mae为：0.308430\n",
      "第81步训练集损失为：0.406932\n",
      "第81步验证集损失为：2.542794\n",
      "第81步验证集rmse为：1.594614\n",
      "第81步验证集mae为：0.307961\n",
      "第82步训练集损失为：0.405352\n",
      "第82步验证集损失为：2.541392\n",
      "第82步验证集rmse为：1.594174\n",
      "第82步验证集mae为：0.307495\n",
      "第83步训练集损失为：0.403800\n",
      "第83步验证集损失为：2.540018\n",
      "第83步验证集rmse为：1.593744\n",
      "第83步验证集mae为：0.307030\n",
      "第84步训练集损失为：0.402276\n",
      "第84步验证集损失为：2.538674\n",
      "第84步验证集rmse为：1.593322\n",
      "第84步验证集mae为：0.306568\n",
      "第85步训练集损失为：0.400780\n",
      "第85步验证集损失为：2.537357\n",
      "第85步验证集rmse为：1.592908\n",
      "第85步验证集mae为：0.306109\n",
      "第86步训练集损失为：0.399310\n",
      "第86步验证集损失为：2.536066\n",
      "第86步验证集rmse为：1.592503\n",
      "第86步验证集mae为：0.305651\n",
      "第87步训练集损失为：0.397866\n",
      "第87步验证集损失为：2.534802\n",
      "第87步验证集rmse为：1.592106\n",
      "第87步验证集mae为：0.305195\n",
      "第88步训练集损失为：0.396448\n",
      "第88步验证集损失为：2.533563\n",
      "第88步验证集rmse为：1.591717\n",
      "第88步验证集mae为：0.304741\n",
      "第89步训练集损失为：0.395054\n",
      "第89步验证集损失为：2.532348\n",
      "第89步验证集rmse为：1.591335\n",
      "第89步验证集mae为：0.304289\n",
      "第90步训练集损失为：0.393684\n",
      "第90步验证集损失为：2.531157\n",
      "第90步验证集rmse为：1.590961\n",
      "第90步验证集mae为：0.303838\n",
      "第91步训练集损失为：0.392338\n",
      "第91步验证集损失为：2.529989\n",
      "第91步验证集rmse为：1.590594\n",
      "第91步验证集mae为：0.303389\n",
      "第92步训练集损失为：0.391015\n",
      "第92步验证集损失为：2.528843\n",
      "第92步验证集rmse为：1.590234\n",
      "第92步验证集mae为：0.302942\n",
      "第93步训练集损失为：0.389714\n",
      "第93步验证集损失为：2.527718\n",
      "第93步验证集rmse为：1.589880\n",
      "第93步验证集mae为：0.302496\n",
      "第94步训练集损失为：0.388435\n",
      "第94步验证集损失为：2.526615\n",
      "第94步验证集rmse为：1.589533\n",
      "第94步验证集mae为：0.302052\n",
      "第95步训练集损失为：0.387177\n",
      "第95步验证集损失为：2.525532\n",
      "第95步验证集rmse为：1.589192\n",
      "第95步验证集mae为：0.301609\n",
      "第96步训练集损失为：0.385940\n",
      "第96步验证集损失为：2.524469\n",
      "第96步验证集rmse为：1.588858\n",
      "第96步验证集mae为：0.301168\n",
      "第97步训练集损失为：0.384723\n",
      "第97步验证集损失为：2.523424\n",
      "第97步验证集rmse为：1.588529\n",
      "第97步验证集mae为：0.300728\n",
      "第98步训练集损失为：0.383527\n",
      "第98步验证集损失为：2.522399\n",
      "第98步验证集rmse为：1.588206\n",
      "第98步验证集mae为：0.300290\n",
      "第99步训练集损失为：0.382349\n",
      "第99步验证集损失为：2.521392\n",
      "第99步验证集rmse为：1.587889\n",
      "第99步验证集mae为：0.299853\n",
      "第100步训练集损失为：0.381191\n",
      "第100步验证集损失为：2.520402\n",
      "第100步验证集rmse为：1.587577\n",
      "第100步验证集mae为：0.299417\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第101步训练集损失为：0.380052\n",
      "第101步验证集损失为：2.519429\n",
      "第101步验证集rmse为：1.587271\n",
      "第101步验证集mae为：0.298982\n",
      "第102步训练集损失为：0.378930\n",
      "第102步验证集损失为：2.518473\n",
      "第102步验证集rmse为：1.586970\n",
      "第102步验证集mae为：0.298549\n",
      "第103步训练集损失为：0.377826\n",
      "第103步验证集损失为：2.517533\n",
      "第103步验证集rmse为：1.586673\n",
      "第103步验证集mae为：0.298117\n",
      "第104步训练集损失为：0.376740\n",
      "第104步验证集损失为：2.516608\n",
      "第104步验证集rmse为：1.586382\n",
      "第104步验证集mae为：0.297687\n",
      "第105步训练集损失为：0.375671\n",
      "第105步验证集损失为：2.515699\n",
      "第105步验证集rmse为：1.586096\n",
      "第105步验证集mae为：0.297257\n",
      "第106步训练集损失为：0.374618\n",
      "第106步验证集损失为：2.514805\n",
      "第106步验证集rmse为：1.585814\n",
      "第106步验证集mae为：0.296829\n",
      "第107步训练集损失为：0.373581\n",
      "第107步验证集损失为：2.513925\n",
      "第107步验证集rmse为：1.585536\n",
      "第107步验证集mae为：0.296402\n",
      "第108步训练集损失为：0.372561\n",
      "第108步验证集损失为：2.513059\n",
      "第108步验证集rmse为：1.585263\n",
      "第108步验证集mae为：0.295977\n",
      "第109步训练集损失为：0.371556\n",
      "第109步验证集损失为：2.512207\n",
      "第109步验证集rmse为：1.584994\n",
      "第109步验证集mae为：0.295553\n",
      "第110步训练集损失为：0.370566\n",
      "第110步验证集损失为：2.511368\n",
      "第110步验证集rmse为：1.584730\n",
      "第110步验证集mae为：0.295129\n",
      "第111步训练集损失为：0.369591\n",
      "第111步验证集损失为：2.510542\n",
      "第111步验证集rmse为：1.584469\n",
      "第111步验证集mae为：0.294708\n",
      "第112步训练集损失为：0.368631\n",
      "第112步验证集损失为：2.509729\n",
      "第112步验证集rmse为：1.584213\n",
      "第112步验证集mae为：0.294287\n",
      "第113步训练集损失为：0.367686\n",
      "第113步验证集损失为：2.508928\n",
      "第113步验证集rmse为：1.583960\n",
      "第113步验证集mae为：0.293868\n",
      "第114步训练集损失为：0.366754\n",
      "第114步验证集损失为：2.508140\n",
      "第114步验证集rmse为：1.583711\n",
      "第114步验证集mae为：0.293449\n",
      "第115步训练集损失为：0.365836\n",
      "第115步验证集损失为：2.507362\n",
      "第115步验证集rmse为：1.583465\n",
      "第115步验证集mae为：0.293032\n",
      "第116步训练集损失为：0.364931\n",
      "第116步验证集损失为：2.506597\n",
      "第116步验证集rmse为：1.583223\n",
      "第116步验证集mae为：0.292617\n",
      "第117步训练集损失为：0.364040\n",
      "第117步验证集损失为：2.505842\n",
      "第117步验证集rmse为：1.582985\n",
      "第117步验证集mae为：0.292202\n",
      "第118步训练集损失为：0.363162\n",
      "第118步验证集损失为：2.505098\n",
      "第118步验证集rmse为：1.582750\n",
      "第118步验证集mae为：0.291789\n",
      "第119步训练集损失为：0.362296\n",
      "第119步验证集损失为：2.504365\n",
      "第119步验证集rmse为：1.582519\n",
      "第119步验证集mae为：0.291377\n",
      "第120步训练集损失为：0.361443\n",
      "第120步验证集损失为：2.503642\n",
      "第120步验证集rmse为：1.582290\n",
      "第120步验证集mae为：0.290967\n",
      "第121步训练集损失为：0.360602\n",
      "第121步验证集损失为：2.502929\n",
      "第121步验证集rmse为：1.582065\n",
      "第121步验证集mae为：0.290557\n",
      "第122步训练集损失为：0.359773\n",
      "第122步验证集损失为：2.502226\n",
      "第122步验证集rmse为：1.581843\n",
      "第122步验证集mae为：0.290149\n",
      "第123步训练集损失为：0.358955\n",
      "第123步验证集损失为：2.501533\n",
      "第123步验证集rmse为：1.581623\n",
      "第123步验证集mae为：0.289743\n",
      "第124步训练集损失为：0.358149\n",
      "第124步验证集损失为：2.500849\n",
      "第124步验证集rmse为：1.581407\n",
      "第124步验证集mae为：0.289337\n",
      "第125步训练集损失为：0.357354\n",
      "第125步验证集损失为：2.500174\n",
      "第125步验证集rmse为：1.581194\n",
      "第125步验证集mae为：0.288933\n",
      "第126步训练集损失为：0.356570\n",
      "第126步验证集损失为：2.499509\n",
      "第126步验证集rmse为：1.580983\n",
      "第126步验证集mae为：0.288531\n",
      "第127步训练集损失为：0.355797\n",
      "第127步验证集损失为：2.498852\n",
      "第127步验证集rmse为：1.580776\n",
      "第127步验证集mae为：0.288129\n",
      "第128步训练集损失为：0.355035\n",
      "第128步验证集损失为：2.498204\n",
      "第128步验证集rmse为：1.580571\n",
      "第128步验证集mae为：0.287729\n",
      "第129步训练集损失为：0.354283\n",
      "第129步验证集损失为：2.497564\n",
      "第129步验证集rmse为：1.580368\n",
      "第129步验证集mae为：0.287331\n",
      "第130步训练集损失为：0.353541\n",
      "第130步验证集损失为：2.496933\n",
      "第130步验证集rmse为：1.580169\n",
      "第130步验证集mae为：0.286934\n",
      "第131步训练集损失为：0.352810\n",
      "第131步验证集损失为：2.496310\n",
      "第131步验证集rmse为：1.579971\n",
      "第131步验证集mae为：0.286538\n",
      "第132步训练集损失为：0.352088\n",
      "第132步验证集损失为：2.495694\n",
      "第132步验证集rmse为：1.579777\n",
      "第132步验证集mae为：0.286143\n",
      "第133步训练集损失为：0.351375\n",
      "第133步验证集损失为：2.495087\n",
      "第133步验证集rmse为：1.579584\n",
      "第133步验证集mae为：0.285750\n",
      "第134步训练集损失为：0.350672\n",
      "第134步验证集损失为：2.494487\n",
      "第134步验证集rmse为：1.579395\n",
      "第134步验证集mae为：0.285359\n",
      "第135步训练集损失为：0.349979\n",
      "第135步验证集损失为：2.493895\n",
      "第135步验证集rmse为：1.579207\n",
      "第135步验证集mae为：0.284969\n",
      "第136步训练集损失为：0.349294\n",
      "第136步验证集损失为：2.493310\n",
      "第136步验证集rmse为：1.579022\n",
      "第136步验证集mae为：0.284581\n",
      "第137步训练集损失为：0.348619\n",
      "第137步验证集损失为：2.492733\n",
      "第137步验证集rmse为：1.578839\n",
      "第137步验证集mae为：0.284194\n",
      "第138步训练集损失为：0.347952\n",
      "第138步验证集损失为：2.492162\n",
      "第138步验证集rmse为：1.578658\n",
      "第138步验证集mae为：0.283808\n",
      "第139步训练集损失为：0.347294\n",
      "第139步验证集损失为：2.491599\n",
      "第139步验证集rmse为：1.578480\n",
      "第139步验证集mae为：0.283424\n",
      "第140步训练集损失为：0.346644\n",
      "第140步验证集损失为：2.491043\n",
      "第140步验证集rmse为：1.578304\n",
      "第140步验证集mae为：0.283042\n",
      "第141步训练集损失为：0.346002\n",
      "第141步验证集损失为：2.490493\n",
      "第141步验证集rmse为：1.578130\n",
      "第141步验证集mae为：0.282661\n",
      "第142步训练集损失为：0.345369\n",
      "第142步验证集损失为：2.489951\n",
      "第142步验证集rmse为：1.577958\n",
      "第142步验证集mae为：0.282282\n",
      "第143步训练集损失为：0.344744\n",
      "第143步验证集损失为：2.489415\n",
      "第143步验证集rmse为：1.577788\n",
      "第143步验证集mae为：0.281904\n",
      "第144步训练集损失为：0.344126\n",
      "第144步验证集损失为：2.488885\n",
      "第144步验证集rmse为：1.577620\n",
      "第144步验证集mae为：0.281528\n",
      "第145步训练集损失为：0.343516\n",
      "第145步验证集损失为：2.488362\n",
      "第145步验证集rmse为：1.577454\n",
      "第145步验证集mae为：0.281154\n",
      "第146步训练集损失为：0.342914\n",
      "第146步验证集损失为：2.487845\n",
      "第146步验证集rmse为：1.577291\n",
      "第146步验证集mae为：0.280781\n",
      "第147步训练集损失为：0.342319\n",
      "第147步验证集损失为：2.487335\n",
      "第147步验证集rmse为：1.577129\n",
      "第147步验证集mae为：0.280410\n",
      "第148步训练集损失为：0.341732\n",
      "第148步验证集损失为：2.486831\n",
      "第148步验证集rmse为：1.576969\n",
      "第148步验证集mae为：0.280041\n",
      "第149步训练集损失为：0.341152\n",
      "第149步验证集损失为：2.486333\n",
      "第149步验证集rmse为：1.576811\n",
      "第149步验证集mae为：0.279673\n",
      "第150步训练集损失为：0.340578\n",
      "第150步验证集损失为：2.485841\n",
      "第150步验证集rmse为：1.576655\n",
      "第150步验证集mae为：0.279307\n",
      "第151步训练集损失为：0.340012\n",
      "第151步验证集损失为：2.485355\n",
      "第151步验证集rmse为：1.576501\n",
      "第151步验证集mae为：0.278943\n",
      "第152步训练集损失为：0.339453\n",
      "第152步验证集损失为：2.484875\n",
      "第152步验证集rmse为：1.576349\n",
      "第152步验证集mae为：0.278581\n",
      "第153步训练集损失为：0.338900\n",
      "第153步验证集损失为：2.484401\n",
      "第153步验证集rmse为：1.576198\n",
      "第153步验证集mae为：0.278220\n",
      "第154步训练集损失为：0.338354\n",
      "第154步验证集损失为：2.483932\n",
      "第154步验证集rmse为：1.576050\n",
      "第154步验证集mae为：0.277861\n",
      "第155步训练集损失为：0.337814\n",
      "第155步验证集损失为：2.483469\n",
      "第155步验证集rmse为：1.575903\n",
      "第155步验证集mae为：0.277504\n",
      "第156步训练集损失为：0.337280\n",
      "第156步验证集损失为：2.483012\n",
      "第156步验证集rmse为：1.575758\n",
      "第156步验证集mae为：0.277149\n",
      "第157步训练集损失为：0.336753\n",
      "第157步验证集损失为：2.482561\n",
      "第157步验证集rmse为：1.575614\n",
      "第157步验证集mae为：0.276796\n",
      "第158步训练集损失为：0.336232\n",
      "第158步验证集损失为：2.482115\n",
      "第158步验证集rmse为：1.575473\n",
      "第158步验证集mae为：0.276445\n",
      "第159步训练集损失为：0.335718\n",
      "第159步验证集损失为：2.481675\n",
      "第159步验证集rmse为：1.575333\n",
      "第159步验证集mae为：0.276095\n",
      "第160步训练集损失为：0.335209\n",
      "第160步验证集损失为：2.481240\n",
      "第160步验证集rmse为：1.575195\n",
      "第160步验证集mae为：0.275747\n",
      "第161步训练集损失为：0.334706\n",
      "第161步验证集损失为：2.480810\n",
      "第161步验证集rmse为：1.575059\n",
      "第161步验证集mae为：0.275402\n",
      "第162步训练集损失为：0.334208\n",
      "第162步验证集损失为：2.480386\n",
      "第162步验证集rmse为：1.574924\n",
      "第162步验证集mae为：0.275058\n",
      "第163步训练集损失为：0.333717\n",
      "第163步验证集损失为：2.479967\n",
      "第163步验证集rmse为：1.574791\n",
      "第163步验证集mae为：0.274716\n",
      "第164步训练集损失为：0.333231\n",
      "第164步验证集损失为：2.479554\n",
      "第164步验证集rmse为：1.574660\n",
      "第164步验证集mae为：0.274376\n",
      "第165步训练集损失为：0.332750\n",
      "第165步验证集损失为：2.479146\n",
      "第165步验证集rmse为：1.574530\n",
      "第165步验证集mae为：0.274038\n",
      "第166步训练集损失为：0.332275\n",
      "第166步验证集损失为：2.478742\n",
      "第166步验证集rmse为：1.574402\n",
      "第166步验证集mae为：0.273703\n",
      "第167步训练集损失为：0.331806\n",
      "第167步验证集损失为：2.478344\n",
      "第167步验证集rmse为：1.574276\n",
      "第167步验证集mae为：0.273369\n",
      "第168步训练集损失为：0.331341\n",
      "第168步验证集损失为：2.477951\n",
      "第168步验证集rmse为：1.574151\n",
      "第168步验证集mae为：0.273037\n",
      "第169步训练集损失为：0.330882\n",
      "第169步验证集损失为：2.477563\n",
      "第169步验证集rmse为：1.574028\n",
      "第169步验证集mae为：0.272707\n",
      "第170步训练集损失为：0.330428\n",
      "第170步验证集损失为：2.477180\n",
      "第170步验证集rmse为：1.573906\n",
      "第170步验证集mae为：0.272380\n",
      "第171步训练集损失为：0.329978\n",
      "第171步验证集损失为：2.476802\n",
      "第171步验证集rmse为：1.573786\n",
      "第171步验证集mae为：0.272054\n",
      "第172步训练集损失为：0.329534\n",
      "第172步验证集损失为：2.476429\n",
      "第172步验证集rmse为：1.573667\n",
      "第172步验证集mae为：0.271730\n",
      "第173步训练集损失为：0.329095\n",
      "第173步验证集损失为：2.476061\n",
      "第173步验证集rmse为：1.573550\n",
      "第173步验证集mae为：0.271409\n",
      "第174步训练集损失为：0.328660\n",
      "第174步验证集损失为：2.475697\n",
      "第174步验证集rmse为：1.573435\n",
      "第174步验证集mae为：0.271090\n",
      "第175步训练集损失为：0.328230\n",
      "第175步验证集损失为：2.475338\n",
      "第175步验证集rmse为：1.573321\n",
      "第175步验证集mae为：0.270772\n",
      "第176步训练集损失为：0.327805\n",
      "第176步验证集损失为：2.474984\n",
      "第176步验证集rmse为：1.573208\n",
      "第176步验证集mae为：0.270457\n",
      "第177步训练集损失为：0.327385\n",
      "第177步验证集损失为：2.474635\n",
      "第177步验证集rmse为：1.573097\n",
      "第177步验证集mae为：0.270144\n",
      "第178步训练集损失为：0.326969\n",
      "第178步验证集损失为：2.474290\n",
      "第178步验证集rmse为：1.572988\n",
      "第178步验证集mae为：0.269833\n",
      "第179步训练集损失为：0.326557\n",
      "第179步验证集损失为：2.473950\n",
      "第179步验证集rmse为：1.572880\n",
      "第179步验证集mae为：0.269525\n",
      "第180步训练集损失为：0.326150\n",
      "第180步验证集损失为：2.473614\n",
      "第180步验证集rmse为：1.572773\n",
      "第180步验证集mae为：0.269218\n",
      "第181步训练集损失为：0.325747\n",
      "第181步验证集损失为：2.473283\n",
      "第181步验证集rmse为：1.572668\n",
      "第181步验证集mae为：0.268914\n",
      "第182步训练集损失为：0.325349\n",
      "第182步验证集损失为：2.472957\n",
      "第182步验证集rmse为：1.572564\n",
      "第182步验证集mae为：0.268612\n",
      "第183步训练集损失为：0.324955\n",
      "第183步验证集损失为：2.472635\n",
      "第183步验证集rmse为：1.572461\n",
      "第183步验证集mae为：0.268312\n",
      "第184步训练集损失为：0.324565\n",
      "第184步验证集损失为：2.472317\n",
      "第184步验证集rmse为：1.572360\n",
      "第184步验证集mae为：0.268014\n",
      "第185步训练集损失为：0.324179\n",
      "第185步验证集损失为：2.472003\n",
      "第185步验证集rmse为：1.572261\n",
      "第185步验证集mae为：0.267718\n",
      "第186步训练集损失为：0.323797\n",
      "第186步验证集损失为：2.471694\n",
      "第186步验证集rmse为：1.572162\n",
      "第186步验证集mae为：0.267425\n",
      "第187步训练集损失为：0.323419\n",
      "第187步验证集损失为：2.471389\n",
      "第187步验证集rmse为：1.572065\n",
      "第187步验证集mae为：0.267134\n",
      "第188步训练集损失为：0.323045\n",
      "第188步验证集损失为：2.471089\n",
      "第188步验证集rmse为：1.571970\n",
      "第188步验证集mae为：0.266845\n",
      "第189步训练集损失为：0.322675\n",
      "第189步验证集损失为：2.470792\n",
      "第189步验证集rmse为：1.571875\n",
      "第189步验证集mae为：0.266558\n",
      "第190步训练集损失为：0.322309\n",
      "第190步验证集损失为：2.470500\n",
      "第190步验证集rmse为：1.571782\n",
      "第190步验证集mae为：0.266274\n",
      "第191步训练集损失为：0.321947\n",
      "第191步验证集损失为：2.470211\n",
      "第191步验证集rmse为：1.571691\n",
      "第191步验证集mae为：0.265992\n",
      "第192步训练集损失为：0.321588\n",
      "第192步验证集损失为：2.469927\n",
      "第192步验证集rmse为：1.571600\n",
      "第192步验证集mae为：0.265712\n",
      "第193步训练集损失为：0.321234\n",
      "第193步验证集损失为：2.469647\n",
      "第193步验证集rmse为：1.571511\n",
      "第193步验证集mae为：0.265434\n",
      "第194步训练集损失为：0.320883\n",
      "第194步验证集损失为：2.469370\n",
      "第194步验证集rmse为：1.571423\n",
      "第194步验证集mae为：0.265158\n",
      "第195步训练集损失为：0.320535\n",
      "第195步验证集损失为：2.469098\n",
      "第195步验证集rmse为：1.571336\n",
      "第195步验证集mae为：0.264885\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第196步训练集损失为：0.320191\n",
      "第196步验证集损失为：2.468829\n",
      "第196步验证集rmse为：1.571251\n",
      "第196步验证集mae为：0.264614\n",
      "第197步训练集损失为：0.319851\n",
      "第197步验证集损失为：2.468564\n",
      "第197步验证集rmse为：1.571167\n",
      "第197步验证集mae为：0.264345\n",
      "第198步训练集损失为：0.319514\n",
      "第198步验证集损失为：2.468303\n",
      "第198步验证集rmse为：1.571083\n",
      "第198步验证集mae为：0.264079\n",
      "第199步训练集损失为：0.319181\n",
      "第199步验证集损失为：2.468046\n",
      "第199步验证集rmse为：1.571002\n",
      "第199步验证集mae为：0.263814\n",
      "第200步训练集损失为：0.318851\n",
      "第200步验证集损失为：2.467792\n",
      "第200步验证集rmse为：1.570921\n",
      "第200步验证集mae为：0.263552\n",
      "第201步训练集损失为：0.318525\n",
      "第201步验证集损失为：2.467542\n",
      "第201步验证集rmse为：1.570841\n",
      "第201步验证集mae为：0.263292\n",
      "第202步训练集损失为：0.318202\n",
      "第202步验证集损失为：2.467296\n",
      "第202步验证集rmse为：1.570763\n",
      "第202步验证集mae为：0.263035\n",
      "第203步训练集损失为：0.317882\n",
      "第203步验证集损失为：2.467053\n",
      "第203步验证集rmse为：1.570685\n",
      "第203步验证集mae为：0.262779\n",
      "第204步训练集损失为：0.317565\n",
      "第204步验证集损失为：2.466813\n",
      "第204步验证集rmse为：1.570609\n",
      "第204步验证集mae为：0.262526\n",
      "第205步训练集损失为：0.317252\n",
      "第205步验证集损失为：2.466577\n",
      "第205步验证集rmse为：1.570534\n",
      "第205步验证集mae为：0.262275\n",
      "第206步训练集损失为：0.316942\n",
      "第206步验证集损失为：2.466345\n",
      "第206步验证集rmse为：1.570460\n",
      "第206步验证集mae为：0.262026\n",
      "第207步训练集损失为：0.316635\n",
      "第207步验证集损失为：2.466115\n",
      "第207步验证集rmse为：1.570387\n",
      "第207步验证集mae为：0.261780\n",
      "第208步训练集损失为：0.316331\n",
      "第208步验证集损失为：2.465890\n",
      "第208步验证集rmse为：1.570315\n",
      "第208步验证集mae为：0.261535\n",
      "第209步训练集损失为：0.316031\n",
      "第209步验证集损失为：2.465667\n",
      "第209步验证集rmse为：1.570244\n",
      "第209步验证集mae为：0.261293\n",
      "第210步训练集损失为：0.315733\n",
      "第210步验证集损失为：2.465448\n",
      "第210步验证集rmse为：1.570174\n",
      "第210步验证集mae为：0.261053\n",
      "第211步训练集损失为：0.315438\n",
      "第211步验证集损失为：2.465231\n",
      "第211步验证集rmse为：1.570106\n",
      "第211步验证集mae为：0.260815\n",
      "第212步训练集损失为：0.315147\n",
      "第212步验证集损失为：2.465018\n",
      "第212步验证集rmse为：1.570038\n",
      "第212步验证集mae为：0.260580\n",
      "第213步训练集损失为：0.314858\n",
      "第213步验证集损失为：2.464808\n",
      "第213步验证集rmse为：1.569971\n",
      "第213步验证集mae为：0.260346\n",
      "第214步训练集损失为：0.314572\n",
      "第214步验证集损失为：2.464602\n",
      "第214步验证集rmse为：1.569905\n",
      "第214步验证集mae为：0.260115\n",
      "第215步训练集损失为：0.314290\n",
      "第215步验证集损失为：2.464398\n",
      "第215步验证集rmse为：1.569840\n",
      "第215步验证集mae为：0.259886\n",
      "第216步训练集损失为：0.314010\n",
      "第216步验证集损失为：2.464197\n",
      "第216步验证集rmse为：1.569776\n",
      "第216步验证集mae为：0.259659\n",
      "第217步训练集损失为：0.313733\n",
      "第217步验证集损失为：2.463999\n",
      "第217步验证集rmse为：1.569713\n",
      "第217步验证集mae为：0.259434\n",
      "第218步训练集损失为：0.313458\n",
      "第218步验证集损失为：2.463804\n",
      "第218步验证集rmse为：1.569651\n",
      "第218步验证集mae为：0.259211\n",
      "第219步训练集损失为：0.313187\n",
      "第219步验证集损失为：2.463611\n",
      "第219步验证集rmse为：1.569590\n",
      "第219步验证集mae为：0.258991\n",
      "第220步训练集损失为：0.312918\n",
      "第220步验证集损失为：2.463422\n",
      "第220步验证集rmse为：1.569529\n",
      "第220步验证集mae为：0.258772\n",
      "第221步训练集损失为：0.312652\n",
      "第221步验证集损失为：2.463235\n",
      "第221步验证集rmse为：1.569470\n",
      "第221步验证集mae为：0.258556\n",
      "第222步训练集损失为：0.312389\n",
      "第222步验证集损失为：2.463051\n",
      "第222步验证集rmse为：1.569411\n",
      "第222步验证集mae为：0.258341\n",
      "第223步训练集损失为：0.312128\n",
      "第223步验证集损失为：2.462870\n",
      "第223步验证集rmse为：1.569353\n",
      "第223步验证集mae为：0.258129\n",
      "第224步训练集损失为：0.311870\n",
      "第224步验证集损失为：2.462692\n",
      "第224步验证集rmse为：1.569297\n",
      "第224步验证集mae为：0.257919\n",
      "第225步训练集损失为：0.311614\n",
      "第225步验证集损失为：2.462516\n",
      "第225步验证集rmse为：1.569240\n",
      "第225步验证集mae为：0.257710\n",
      "第226步训练集损失为：0.311362\n",
      "第226步验证集损失为：2.462342\n",
      "第226步验证集rmse为：1.569185\n",
      "第226步验证集mae为：0.257504\n",
      "第227步训练集损失为：0.311111\n",
      "第227步验证集损失为：2.462171\n",
      "第227步验证集rmse为：1.569131\n",
      "第227步验证集mae为：0.257300\n",
      "第228步训练集损失为：0.310864\n",
      "第228步验证集损失为：2.462003\n",
      "第228步验证集rmse为：1.569077\n",
      "第228步验证集mae为：0.257098\n",
      "第229步训练集损失为：0.310618\n",
      "第229步验证集损失为：2.461837\n",
      "第229步验证集rmse为：1.569024\n",
      "第229步验证集mae为：0.256898\n",
      "第230步训练集损失为：0.310375\n",
      "第230步验证集损失为：2.461673\n",
      "第230步验证集rmse为：1.568972\n",
      "第230步验证集mae为：0.256700\n",
      "第231步训练集损失为：0.310135\n",
      "第231步验证集损失为：2.461512\n",
      "第231步验证集rmse为：1.568921\n",
      "第231步验证集mae为：0.256503\n",
      "第232步训练集损失为：0.309887\n",
      "第232步验证集损失为：2.461406\n",
      "第232步验证集rmse为：1.568887\n",
      "第232步验证集mae为：0.256540\n",
      "用时:6022.574449秒\n"
     ]
    }
   ],
   "source": [
    "start=time.time()\n",
    "P,Q,train_rmse_lst,validation_rmse_lst,train_mae_lst,validation_mae_lst=LatentFactorModel(train,20,0.01,0.01,1000)\n",
    "end=time.time()\n",
    "print(\"用时:%f秒\"%(end-start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "397628f3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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V1fHSSedxKZNm4Z1/ly3Ju+//37mz59PXV0dl1566W77tm/fzumnn05DQwPNzc1ceOGFqfrmzp2LmbF27VqOP/54zIzPfvaze5w/261J5xw/+MEP2G+//Zg8eTLnnXcebW1tADz55JO0tLTw+OOPc+CBB1JbW8snP/lJenqKM1RJPWK5pG5NqkdMRERG4L8uh00vl+fa0xbCSd8Z1iEf/vCHicVi/OUvf+Hoo48mFovx6KOP8thjj3HHHXdw00038cQTTzB9+nQuuOACrrnmGn70ox+NqszVq1dzxhlncMMNN3DKKadw1VVXsXbt2tT+Sy65hDVr1rBixQq6uro46aSTWLJkCZ/+9Kd54YUXiMfjHHroodx8880ce+yxRCKRIV33lltu4dvf/jZ33303s2bN4ktf+hJnnXUWDz30EOAFwK9//evcdtttVFdX8+EPf5h77713SGPchktBLJdUEFOPmIiIjH/hcJjTTz+dhx56iKOPPppnnnmGSZMm8f73v58FCxZw6qmnArB8+XJ6enpYvXr1qK953333ceCBB3LRRRcBcNNNN3Hvvfem9l9//fVUVVWxY8cOVq1ahZmlrltXVwdAIBBgwoQJNDY2Dvm6N910E5deeilLly4FvGC2cOFC3nnnHQA6Ojq49dZbOfroowFYunTpbgGxkBTEcglrjJiIiIzCMHukKsGZZ57Jl7/8Zf7lX/6FBx98kDPPPBOA9evXc/755/PKK6+waNEiamtr6ezsHPX1NmzYQEtLS2q9sbGRyZMnp9b/9Kc/cckll9DV1cX73/9+mpqaiMfjo77u2rVrmTt3bmo9ubxmzRrMjIaGhlQIA4hGo7gizStakjFiZjbRzJaa2eTBW1cI9YiJiMhe5rjjjqO9vZ233nqLhx56iH/8x38E4MILL2S//fZj+/btPPnkk5x88skFud60adNYv359ar2jo4Pt27cD0Nvby2c/+1kuv/xyNm7cyIMPPrhbeEoKBALDDkktLS288cYbqfXk8pw5cwCG1bs2WkUPYmbWBDwMHAk8YWbNOdrdbmbPmdlVxa5pSDRGTERE9jJmxhlnnME111xDY2MjCxYsAKC9vZ14PM6WLVu47777+OY3v1mQHqJPfepTvPTSS9x6662sW7eOr33ta8RiMQD6+vro7e2lp6eH9evX893vfpf7779/j+secMABPPLI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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "plt.figure(figsize=(10,5))\n",
    "x=np.arange(1,len(train_rmse_lst)+1)\n",
    "y_train_rmse_lst=train_rmse_lst\n",
    "y_validation_rmse_lst=validation_rmse_lst\n",
    "plt.plot(x,y_train_rmse_lst,label=\"train\")\n",
    "plt.plot(x,y_validation_rmse_lst,label=\"validation\")\n",
    "plt.xlabel(\"training steps\",fontsize=15)\n",
    "plt.ylabel(\"RMSE\",fontsize=15)\n",
    "plt.legend(fontsize=15)\n",
    "\n",
    "plt.savefig(\"E:/推荐系统/图片/LFM_RMSE.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "39a1d209",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmIAAAE9CAYAAACoZg5ZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAxkklEQVR4nO3de5wcZZ3v8e+vunsumWQmt8mVhAESIEAIaAQiqGEXRDAqqyiaBWE1wpHLuoLnAAvnbFjkuO4uoAuCG5YVFhcREQFBBTkS5aWATATCLdwkCUkICblNkrl293P+qOqZnp7u6Z6Zrr5MPu/Xq19dVf1U1TNT6eSb53nqKXPOCQAAAKXnlbsCAAAA+yqCGAAAQJkQxAAAAMqEIAYAAFAmBDEAAIAyIYgBAACUSTTsE5hZk6S7JUUk7ZV0pnOuO6NMVNKfg5ckXeyceyHXMSdPnuxaWlrCqTAAAEARrVq16j3nXHO2z0IPYpL+WtL1zrlfm9ktkj4m6cGMMkdK+pFz7rJCDtjS0qLW1tYiVxMAAKD4zGxdrs9CD2LOuZvTVpslbclS7DhJS8zsREkvSDrfORcPu24AAADlVLIxYma2SNIE59xTWT5+RtJJzrljJMUknVaqegEAAJRLKbomZWYTJd0o6TM5iqx2znUFy62S5mY5xnmSzpOk2bNnh1FNAACAkgq9RczMaiT9RNIVzrlcfaR3mtkCM4tIOl3S85kFnHMrnHMLnXMLm5uzjncDAACoKqVoEfuypPdJutLMrpT0uKSYc+6qtDL/KOkuSSbpQefcYyWoFwAAQFmVYrD+LZJuyVPmRfl3TgIAAOwzSjJGDACA0a6trU1btmxRT09PuauCEorFYpoyZYoaGxuHtT9BDACAEWpra9O7776rmTNnqr6+XmZW7iqhBJxz6ujo0MaNGyVpWGGMRxwBADBCW7Zs0cyZMzVmzBhC2D7EzDRmzBjNnDlTW7ZkmyY1P4JYNnu3Sa0/kHbknAgXAIBePT09qq+vL3c1UCb19fXD7pImiGXTtlF66O+kdwbMogEAQFa0hO27RnLtCWLZRGL+e5KnLAEAgPAQxLLxCGIAABTT4sWLdfvtt5e7GhWHuyaziQS/lgS3IAMA9i3nnnuuWlpatHz58qIe96GHHlJNTU1RjzkaEMSy6W0RI4gBAFAMY8eOLXcVKhJdk9mkxojRIgYA2EcsW7ZMZqY77rhDV199tcxM06ZNkyStXbtWZqadO3dq2bJlam5u1ksvvdS771133aWDDz5Y9fX1Ovroo/Xkk08OOH62rsnly5fr3HPP1fXXX69p06ZpwoQJRW+Jq3S0iGXjBb8WxogBAIbp6p+/pJc3tZXl3IfNaNQ/fOLwIe1z44036l//9V91wQUXaPbs2br88svlef3baz71qU/pgx/8oO699161tLRIkt544w2dffbZuvXWW3XaaadpxYoVWrZsWb+gNphf/epXevfdd/Xb3/5Wra2tOvvss3XOOefogAMOGFL9qxVBLBtaxAAA+5j6+nrV19erpqZGdXV1Gj9+/IAyH/7wh3XNNdf02zZr1ixt2rRJTU1Nev755/Xee+9pzZo1BZ83kUjoxz/+sRobG3XIIYfoG9/4htavX08Q26cxRgwAMEJDbZGqBpdddtmAbd3d3brkkkv00EMPac6cOZo/f76SyWTBxzz++OP7PRqotrZWzrmi1LcaEMSy6W0Ro2sSALBv8TwvZxDKNuD+hhtu0HPPPae3335bjY2Neumll3THHXcUfL5sLW/7EgbrZ+NFJBktYgCAfc4hhxyi3/zmN9q0aZNWr16t1157bdDyu3fvVjKZ1I4dO/SHP/xB55xzjiTtU61aI0EQyyUSY4wYAGCfc9FFF2nKlCmaO3euTjzxRL355puDlr/kkks0ffp0HXbYYfrKV76i888/X57nadWqVSWqcXWzakysCxcudK2treGe5NoZ0sK/kU65NtzzAACq3iuvvKJ58+aVuxooo8H+DJjZKufcwmyf0SKWSyRKixgAAAgVQSwXL8YYMQAAECqCWC6MEQMAACEjiOXixZhZHwAAhIoglgtjxAAAQMgIYrkwRgwAAISMIJZLJMbM+gAAIFQEsVy8KC1iAAAgVASxXLhrEgAAhIwglgt3TQIAMCQtLS1auXJl1s+WL1+uc889d0THKHadKkG03BWoWJGoFO8udy0AABgVLr/8ciWTyaIft6WlRbfffrsWL16c9fPVq1drzJgxRT9vsRDEcvGiUnJvuWsBAMCoUFdXV5bzNjY2luW8haJrMhePMWIAgH3HQw89pGnTpvVrtTrrrLN0ySWXyDmnK664QtOmTdO4ceN06qmnavPmzUM6fq6uyfvuu08HH3ywxo0bp0svvbTfZ9u2bdMZZ5yhpqYmNTc368ILL+yt35w5c2RmWrdunU488USZmT7/+c8POH62rknnnL7zne/owAMP1OTJk7Vs2TK1tbVJklauXKmWlhY99thjmjdvnhoaGvRXf/VX6uzsHNLPWyhaxHKJMEYMADACv7xc2vxCec49bb506j8NaZdTTjlF8XhcTz/9tBYtWqR4PK5f/OIXeuSRR3T77bfrpptu0uOPP67p06fr/PPP1zXXXKPvfe97I6rmmjVrdOaZZ+qGG27QkiVLdNVVV2ndunW9n19yySVau3atnn/+ebW3t+vUU0/V4sWL9dnPflbPPvusEomEjjzySN1888064YQTVFNTU9B5b7nlFl177bW66667NGvWLH3lK1/RWWedpQcffFCSHwC//vWv69Zbb1V9fb1OOeUU3X333QWNcRsqglguHjPrAwD2HbFYTGeccYYefPBBLVq0SE888YQmTZqkD3zgAzr00EN1+umnS5JWrVqlzs5OrVmzZsTnvPfeezVv3jxddNFFkqSbbrpJd999d+/n119/verq6rR9+3a98sorMrPe844bN06S5Hmexo4dq/Hjxxd83ptuukmXXnqpTj75ZEl+MJs/f77eeustSdKePXu0YsUKLVq0SJJ08skn9wuIxUQQyyXCzPoAgBEYYotUJVi6dKm++tWv6lvf+pYeeOABLV26VJK0YcMGnXfeeXrxxRe1YMECNTQ0aO/ekY+j3rhxo1paWnrXx48fr8mTJ/eu//73v9cll1yi9vZ2feADH9CECROUSCRGfN5169Zpzpw5veup5bVr18rM1NTU1BvCJKm2tlbOuRGfNxvGiOXixaTkyC82AADV4kMf+pB2796tN998Uw8++KC+8IUvSJIuvPBCHXjggdq2bZtWrlyp0047rSjnmzZtmjZs2NC7vmfPHm3btk2S1NXVpc9//vO6/PLLtWnTJj3wwAP9wlOK53lDDkktLS16/fXXe9dTywcccIAkDal1baQIYrnw0G8AwD7GzHTmmWfqmmuu0fjx43XooYdKknbv3q1EIqEtW7bo3nvv1dVXX12UFqLPfOYzWr16tVasWKH169fra1/7muJxf3x2d3e3urq61NnZqQ0bNujb3/627rvvvgHnPeSQQ/Twww9r8+bN+u1vf9s76H4wF198sa677jr9+te/1po1a3TBBRfok5/8ZL/WuVIhiOXCQ78BAPug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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "plt.figure(figsize=(10,5))\n",
    "x=np.arange(1,len(train_rmse_lst)+1)\n",
    "y_train_mae_lst=train_mae_lst\n",
    "y_validation_mae_lst=validation_mae_lst\n",
    "plt.plot(x,y_train_mae_lst,label=\"train\")\n",
    "plt.plot(x,y_validation_mae_lst,label=\"validation\")\n",
    "\n",
    "plt.xlabel(\"training steps\",fontsize=15)\n",
    "plt.ylabel(\"RMSE\",fontsize=15)\n",
    "plt.legend(fontsize=15)\n",
    "plt.savefig(\"E:/推荐系统/图片/LFM_MAE.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "77651e56",
   "metadata": {},
   "outputs": [],
   "source": [
    "result_svd=pd.DataFrame({'TrainRMSE':train_rmse_lst,\n",
    "                        'TrainMAE':train_mae_lst,\n",
    "                        'ValidationRMSE':validation_rmse_lst,\n",
    "                        'ValidationMAE':validation_mae_lst})\n",
    "result_svd.to_csv('E:/推荐系统/图片/result_svd.csv',index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "24e5806b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无法对用户4关于电影43708做出预测，因为训练集中没有该物品数据\n",
      "无法对用户4关于电影26819做出预测，因为训练集中没有该物品数据\n",
      "无法对用户4关于电影26870做出预测，因为训练集中没有该物品数据\n",
      "无法对用户8关于电影1317做出预测，因为训练集中没有该物品数据\n",
      "无法对用户14关于电影166024做出预测，因为训练集中没有该物品数据\n",
      "无法对用户19关于电影545做出预测，因为训练集中没有该物品数据\n",
      "无法对用户48关于电影156387做出预测，因为训练集中没有该物品数据\n",
      "无法对用户51关于电影1317做出预测，因为训练集中没有该物品数据\n",
      "无法对用户54关于电影1426做出预测，因为训练集中没有该物品数据\n",
      "无法对用户55关于电影5765做出预测，因为训练集中没有该物品数据\n",
      "无法对用户55关于电影3759做出预测，因为训练集中没有该物品数据\n",
      "无法对用户56关于电影6220做出预测，因为训练集中没有该物品数据\n",
      "无法对用户56关于电影89780做出预测，因为训练集中没有该物品数据\n",
      "无法对用户56关于电影82242做出预测，因为训练集中没有该物品数据\n",
      "无法对用户71关于电影26587做出预测，因为训练集中没有该物品数据\n",
      "无法对用户71关于电影34542做出预测，因为训练集中没有该物品数据\n",
      "无法对用户71关于电影40586做出预测，因为训练集中没有该物品数据\n",
      "无法对用户73关于电影5515做出预测，因为训练集中没有该物品数据\n",
      "无法对用户73关于电影98795做出预测，因为训练集中没有该物品数据\n",
      "无法对用户73关于电影111757做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影82143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影80185做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影85312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影118244做出预测，因为训练集中没有该物品数据\n",
      "无法对用户83关于电影641做出预测，因为训练集中没有该物品数据\n",
      "无法对用户83关于电影201做出预测，因为训练集中没有该物品数据\n",
      "无法对用户83关于电影754做出预测，因为训练集中没有该物品数据\n",
      "无法对用户88关于电影74156做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影2238做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影6884做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影6762做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影7745做出预测，因为训练集中没有该物品数据\n",
      "无法对用户97关于电影79318做出预测，因为训练集中没有该物品数据\n",
      "无法对用户99关于电影141420做出预测，因为训练集中没有该物品数据\n",
      "无法对用户99关于电影108506做出预测，因为训练集中没有该物品数据\n",
      "无法对用户103关于电影1720做出预测，因为训练集中没有该物品数据\n",
      "无法对用户105关于电影6523做出预测，因为训练集中没有该物品数据\n",
      "无法对用户105关于电影6518做出预测，因为训练集中没有该物品数据\n",
      "无法对用户105关于电影6464做出预测，因为训练集中没有该物品数据\n",
      "无法对用户119关于电影7068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户119关于电影55207做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影160563做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影138212做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影8811做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影33681做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影5597做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影7012做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影7986做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影4497做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影4092做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影9004做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影5764做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影26124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影27003做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影63826做出预测，因为训练集中没有该物品数据\n",
      "无法对用户138关于电影6720做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影6211做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影49951做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影140866做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影140868做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影136908做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影107649做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影140872做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影140880做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影6878做出预测，因为训练集中没有该物品数据\n",
      "无法对用户160关于电影1806做出预测，因为训练集中没有该物品数据\n",
      "无法对用户160关于电影6840做出预测，因为训练集中没有该物品数据\n",
      "无法对用户164关于电影75做出预测，因为训练集中没有该物品数据\n",
      "无法对用户165关于电影298做出预测，因为训练集中没有该物品数据\n",
      "无法对用户165关于电影124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户165关于电影148做出预测，因为训练集中没有该物品数据\n",
      "无法对用户172关于电影94969做出预测，因为训练集中没有该物品数据\n",
      "无法对用户172关于电影98956做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影91325做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影74156做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影145935做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影93475做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影133383做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影122884做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影138210做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影155625做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影159061做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影160573做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影165101做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影160563做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影163937做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影93819做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影145070做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影156387做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影175519做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影166918做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影170403做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影170809做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影161127做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影131170做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影76087做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影165347做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影155078做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影130784做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影127188做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影121143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影157340做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影167036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影177763做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影177497做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影157318做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影158027做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影170645做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影184471做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影178421做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影152061做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影174371做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影166544做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影187601做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影105742做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影56022做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影162322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影147942做出预测，因为训练集中没有该物品数据\n",
      "无法对用户182关于电影59333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户187关于电影3118做出预测，因为训练集中没有该物品数据\n",
      "无法对用户196关于电影6311做出预测，因为训练集中没有该物品数据\n",
      "无法对用户206关于电影167842做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影152065做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影105364做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影111661做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影74156做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影163508做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影169992做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影161954做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影163959做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影91416做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影176921做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影167426做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影169068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影165179做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影173141做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影150284做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影163068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影5506做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影103721做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影177689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影180297做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影182379做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影130578做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影181315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影128620做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影163134做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影134796做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影104636做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影138210做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影167794做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影173369做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影183897做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影183161做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影185029做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影179133做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影179119做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影100272做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影32707做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影6961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影175813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影179111做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影127108做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影180451做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影189333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影177651做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影188213做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影118246做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影179135做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影178401做出预测，因为训练集中没有该物品数据\n",
      "无法对用户218关于电影476做出预测，因为训练集中没有该物品数据\n",
      "无法对用户222关于电影62277做出预测，因为训练集中没有该物品数据\n",
      "无法对用户227关于电影26322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6727做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6665做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影5764做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影5745做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影5801做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影5830做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影5864做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影4373做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6109做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影2689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6568做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7386做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6596做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6946做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7389做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影1313做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6563做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7917做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影8149做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影8121做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7995做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7959做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7817做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7815做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7614做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7474做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7478做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7304做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7236做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7128做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7060做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影8585做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影7155做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影1144做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6710做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影1780做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影6375做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5730做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5705做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5731做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5701做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5694做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5843做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5845做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5827做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5935做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5930做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5927做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5926做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5919做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5988做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影4656做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影5011做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6033做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6038做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影868做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影3432做出预测，因为训练集中没有该物品数据\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无法对用户239关于电影6115做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6153做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6106做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6180做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6178做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6177做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6173做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6179做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6240做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6275做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6313做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6321做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6320做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6319做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6308做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6309做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6346做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6348做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6198做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6102做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6430做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影6396做出预测，因为训练集中没有该物品数据\n",
      "无法对用户241关于电影1442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户243关于电影25934做出预测，因为训练集中没有该物品数据\n",
      "无法对用户247关于电影73572做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影109243做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影133782做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影174909做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影179345做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影177231做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影183897做出预测，因为训练集中没有该物品数据\n",
      "无法对用户249关于电影4240做出预测，因为训练集中没有该物品数据\n",
      "无法对用户249关于电影4077做出预测，因为训练集中没有该物品数据\n",
      "无法对用户249关于电影4313做出预测，因为训练集中没有该物品数据\n",
      "无法对用户250关于电影8033做出预测，因为训练集中没有该物品数据\n",
      "无法对用户255关于电影3078做出预测，因为训练集中没有该物品数据\n",
      "无法对用户263关于电影7155做出预测，因为训练集中没有该物品数据\n",
      "无法对用户268关于电影6234做出预测，因为训练集中没有该物品数据\n",
      "无法对用户268关于电影7168做出预测，因为训练集中没有该物品数据\n",
      "无法对用户268关于电影6247做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影81312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影53143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影6684做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影47904做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影44100做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影131451做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影6460做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影61697做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影38701做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影51418做出预测，因为训练集中没有该物品数据\n",
      "无法对用户288关于电影3808做出预测，因为训练集中没有该物品数据\n",
      "无法对用户295关于电影71730做出预测，因为训练集中没有该物品数据\n",
      "无法对用户295关于电影7983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户295关于电影49220做出预测，因为训练集中没有该物品数据\n",
      "无法对用户300关于电影4939做出预测，因为训练集中没有该物品数据\n",
      "无法对用户301关于电影5864做出预测，因为训练集中没有该物品数据\n",
      "无法对用户301关于电影6991做出预测，因为训练集中没有该物品数据\n",
      "无法对用户319关于电影2101做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影43983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影163134做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影176103做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影177763做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影56931做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影189363做出预测，因为训练集中没有该物品数据\n",
      "无法对用户332关于电影26198做出预测，因为训练集中没有该物品数据\n",
      "无法对用户332关于电影4676做出预测，因为训练集中没有该物品数据\n",
      "无法对用户332关于电影3501做出预测，因为训练集中没有该物品数据\n",
      "无法对用户339关于电影167620做出预测，因为训练集中没有该物品数据\n",
      "无法对用户339关于电影88267做出预测，因为训练集中没有该物品数据\n",
      "无法对用户343关于电影6314做出预测，因为训练集中没有该物品数据\n",
      "无法对用户345关于电影438做出预测，因为训练集中没有该物品数据\n",
      "无法对用户345关于电影7026做出预测，因为训练集中没有该物品数据\n",
      "无法对用户345关于电影5694做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影4353做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影3442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影4099做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影4654做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影2756做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影3768做出预测，因为训练集中没有该物品数据\n",
      "无法对用户363关于电影26680做出预测，因为训练集中没有该物品数据\n",
      "无法对用户375关于电影179135做出预测，因为训练集中没有该物品数据\n",
      "无法对用户377关于电影55116做出预测，因为训练集中没有该物品数据\n",
      "无法对用户377关于电影60293做出预测，因为训练集中没有该物品数据\n",
      "无法对用户378关于电影69458做出预测，因为训练集中没有该物品数据\n",
      "无法对用户382关于电影5646做出预测，因为训练集中没有该物品数据\n",
      "无法对用户387关于电影62265做出预测，因为训练集中没有该物品数据\n",
      "无法对用户392关于电影26269做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影38994做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影71619做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影71184做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影68963做出预测，因为训练集中没有该物品数据\n",
      "无法对用户402关于电影1133做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影118814做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影74154做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影105855做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影157274做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影97328做出预测，因为训练集中没有该物品数据\n",
      "无法对用户408关于电影1733做出预测，因为训练集中没有该物品数据\n",
      "无法对用户408关于电影1571做出预测，因为训练集中没有该物品数据\n",
      "无法对用户423关于电影245做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影2885做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影3143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影7236做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影4286做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影31107做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影7461做出预测，因为训练集中没有该物品数据\n",
      "无法对用户445关于电影981做出预测，因为训练集中没有该物品数据\n",
      "无法对用户447关于电影6801做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影179863做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影179287做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影179437做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影183815做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影179285做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影184253做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影179491做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影168586做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影126548做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影184937做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影135504做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影114182做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影115828做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影132798做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影186331做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影104947做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影187481做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影79572做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影188449做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影189399做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影189363做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影135230做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影103606做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影123683做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影189333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影128520做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影148388做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影190085做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影132800做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影96863做出预测，因为训练集中没有该物品数据\n",
      "无法对用户457关于电影8010做出预测，因为训练集中没有该物品数据\n",
      "无法对用户458关于电影37477做出预测，因为训练集中没有该物品数据\n",
      "无法对用户458关于电影40574做出预测，因为训练集中没有该物品数据\n",
      "无法对用户458关于电影27408做出预测，因为训练集中没有该物品数据\n",
      "无法对用户463关于电影807做出预测，因为训练集中没有该物品数据\n",
      "无法对用户463关于电影872做出预测，因为训练集中没有该物品数据\n",
      "无法对用户465关于电影106491做出预测，因为训练集中没有该物品数据\n",
      "无法对用户471关于电影162322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户473关于电影3187做出预测，因为训练集中没有该物品数据\n",
      "无法对用户473关于电影3402做出预测，因为训练集中没有该物品数据\n",
      "无法对用户473关于电影3637做出预测，因为训练集中没有该物品数据\n",
      "无法对用户491关于电影1063做出预测，因为训练集中没有该物品数据\n",
      "无法对用户496关于电影3124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户514关于电影59392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户521关于电影59440做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影5588做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影78319做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影92206做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影103547做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影133295做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影96214做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影5891做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影80185做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影5734做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影5786做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影117887做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影6921做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影5725做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影91488做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影81665做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影8933做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影4998做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影33480做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影4405做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影114394做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影6412做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影60189做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影3588做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影7617做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影55926做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影42548做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影116056做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影3311做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影90413做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影129490做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影89305做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影152091做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影167036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影170645做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影169758做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影105608做出预测，因为训练集中没有该物品数据\n",
      "无法对用户548关于电影82744做出预测，因为训练集中没有该物品数据\n",
      "无法对用户556关于电影56060做出预测，因为训练集中没有该物品数据\n",
      "无法对用户556关于电影47491做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影188309做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影133832做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影148172做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影170813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影99721做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影6054做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影6445做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影5392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影3144做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影2201做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影2209做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影8770做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影7437做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影33681做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影26386做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影26285做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影32383做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影26488做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影32116做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影31251做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影7122做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影7815做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影7478做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影7353做出预测，因为训练集中没有该物品数据\n",
      "无法对用户593关于电影2264做出预测，因为训练集中没有该物品数据\n",
      "无法对用户593关于电影2477做出预测，因为训练集中没有该物品数据\n",
      "无法对用户593关于电影3042做出预测，因为训练集中没有该物品数据\n",
      "无法对用户597关于电影103233做出预测，因为训练集中没有该物品数据\n",
      "无法对用户599关于电影26903做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影59336做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影56945做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影59418做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27114做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影60674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影61697做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影59143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影61073做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27450做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影43391做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影31785做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影60405做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影63222做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影62235做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影65939做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影44317做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影65907做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影65552做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影46613做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27643做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影58287做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27309做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27152做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影73511做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影46821做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影26602做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27602做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影72308做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影71910做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影71810做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影61567做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影70706做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影26560做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影26949做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影48673做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影27705做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影74139做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影79536做出预测，因为训练集中没有该物品数据\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无法对用户605关于电影101850做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影6558做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影27729做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影97196做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影80839做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影47202做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影60674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影59392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户616关于电影1460做出预测，因为训练集中没有该物品数据\n",
      "无法对用户632关于电影126548做出预测，因为训练集中没有该物品数据\n",
      "无法对用户653关于电影117464做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影111764做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影108825做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影109963做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影108078做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影73804做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影142456做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影165951做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影162474做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影166285做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影168646做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影87992做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影6012做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影6523做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影6315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影6584做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影6689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影167036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影114552做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影157340做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影130075做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影170957做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影179811做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影133945做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影113604做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影111795做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影114184做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影114265做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影144760做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影140131做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影162322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影161580做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影165527做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影167018做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影166788做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影157312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影140301做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影155509做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影107640做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影167234做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影108134做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影156369做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影165347做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影161956做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影172813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影169028做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影173835做出预测，因为训练集中没有该物品数据\n",
      "无法对用户722关于电影68288做出预测，因为训练集中没有该物品数据\n",
      "无法对用户728关于电影179135做出预测，因为训练集中没有该物品数据\n",
      "无法对用户755关于电影2675做出预测，因为训练集中没有该物品数据\n",
      "无法对用户757关于电影100611做出预测，因为训练集中没有该物品数据\n",
      "无法对用户757关于电影90738做出预测，因为训练集中没有该物品数据\n",
      "无法对用户760关于电影179做出预测，因为训练集中没有该物品数据\n",
      "无法对用户769关于电影108做出预测，因为训练集中没有该物品数据\n",
      "无法对用户772关于电影59143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户778关于电影25801做出预测，因为训练集中没有该物品数据\n",
      "无法对用户790关于电影797做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影6625做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影26849做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影6788做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影32442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影44241做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影70990做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影26856做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影78539做出预测，因为训练集中没有该物品数据\n",
      "无法对用户804关于电影120478做出预测，因为训练集中没有该物品数据\n",
      "无法对用户804关于电影103659做出预测，因为训练集中没有该物品数据\n",
      "无法对用户804关于电影183897做出预测，因为训练集中没有该物品数据\n",
      "无法对用户807关于电影86290做出预测，因为训练集中没有该物品数据\n",
      "无法对用户808关于电影27251做出预测，因为训练集中没有该物品数据\n",
      "无法对用户813关于电影8582做出预测，因为训练集中没有该物品数据\n",
      "无法对用户814关于电影2293做出预测，因为训练集中没有该物品数据\n",
      "无法对用户814关于电影3158做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影85261做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影35015做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影114552做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影104303做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影117887做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影155894做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影127114做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影157961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影141397做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影167732做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影169028做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影140301做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影167018做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影155062做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影166024做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影175333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影180095做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影151759做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影108709做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影164917做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影158858做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影110669做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影184257做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影167392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影178061做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影148036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影168608做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影159195做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影180095做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影180297做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影161127做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影141946做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影157318做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影180045做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影181315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影4404做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影7786做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影43177做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影60816做出预测，因为训练集中没有该物品数据\n",
      "无法对用户842关于电影476做出预测，因为训练集中没有该物品数据\n",
      "无法对用户842关于电影1798做出预测，因为训练集中没有该物品数据\n",
      "无法对用户854关于电影4241做出预测，因为训练集中没有该物品数据\n",
      "无法对用户861关于电影2047做出预测，因为训练集中没有该物品数据\n",
      "无法对用户861关于电影6232做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影60674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影117496做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影123288做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影71201做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影33072做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影33245做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影42783做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影56631做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影59143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影6784做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影54934做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影60141做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影61255做出预测，因为训练集中没有该物品数据\n",
      "无法对用户883关于电影706做出预测，因为训练集中没有该物品数据\n",
      "无法对用户883关于电影834做出预测，因为训练集中没有该物品数据\n",
      "无法对用户890关于电影7059做出预测，因为训练集中没有该物品数据\n",
      "无法对用户890关于电影4263做出预测，因为训练集中没有该物品数据\n",
      "无法对用户896关于电影2938做出预测，因为训练集中没有该物品数据\n",
      "无法对用户907关于电影751做出预测，因为训练集中没有该物品数据\n",
      "无法对用户917关于电影33675做出预测，因为训练集中没有该物品数据\n",
      "无法对用户926关于电影5311做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影48883做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影62049做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影26989做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影63237做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影33410做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影61961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影58367做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影52227做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影54278做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影26700做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影50005做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影7124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影8809做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影55288做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影60816做出预测，因为训练集中没有该物品数据\n",
      "无法对用户932关于电影268做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影34450做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影7041做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影93240做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影133782做出预测，因为训练集中没有该物品数据\n",
      "无法对用户953关于电影2342做出预测，因为训练集中没有该物品数据\n",
      "无法对用户953关于电影115做出预测，因为训练集中没有该物品数据\n",
      "无法对用户953关于电影1571做出预测，因为训练集中没有该物品数据\n",
      "无法对用户954关于电影89480做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影92643做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影106983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影136926做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影111387做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影104339做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影143271做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影141674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影148956做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影140289做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影159191做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影147607做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影117877做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影130970做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影100106做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影44633做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影26164做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影6395做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影103444做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影56490做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影148238做出预测，因为训练集中没有该物品数据\n",
      "无法对用户972关于电影3103做出预测，因为训练集中没有该物品数据\n",
      "无法对用户972关于电影8899做出预测，因为训练集中没有该物品数据\n",
      "无法对用户982关于电影5192做出预测，因为训练集中没有该物品数据\n",
      "无法对用户982关于电影8952做出预测，因为训练集中没有该物品数据\n",
      "无法对用户984关于电影170403做出预测，因为训练集中没有该物品数据\n",
      "无法对用户1000关于电影73860做出预测，因为训练集中没有该物品数据\n",
      "用时95.659784秒\n",
      "RMSE为：1.72477\n",
      "MAE为：0.44776\n"
     ]
    }
   ],
   "source": [
    "record_test = test_predict(record,P,Q)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
